package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.*;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.*;
import java.sql.*;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Sara y Xarles
 */
public class SQLServerCursoDAO implements ICursoDAO {

    private static ResourceBundle rb;

    public SQLServerCursoDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Método que cuenta los cursos para la paginación.
     * @author: dbaykbp.bn
     * @param filtro: Filtro que hay que aplicar a la consulta.
     * @return Devuelve el identificador del número total de cursos.
     */
    public int contarCursos(FiltroCurso filtro) throws GestorFormacionExcepcion {
        int registros = 0;

        Connection conexion = null;
        String sql = filtro.getSQL();

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = stmt.executeQuery();

            if (rs.last()) {
                registros = rs.getRow();
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
        
        return registros;
    }

    /**
     * Metodo que crea un curso nuevo en la base de datos.
     * @author: Aitor/Víctor
     * @param curso: Contiene los datos del curso.
     * @return Devuelve la id del curso.
     */
    public int crearCurso(Curso curso) throws GestorFormacionExcepcion {
        Connection con = null;
        SentenciaNula stmt = null;
        ResultSet rs = null;
        int id = -1;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            stmt = new SentenciaNula(con, "INSERT INTO Curso (CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, CliId,  CurCodINEM, TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva)VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
            stmt.setString(1, curso.getCurNom());
            stmt.setTimestamp(2, curso.getCurFchaInReal());
            stmt.setTimestamp(3, curso.getCurFchaFinReal());
            stmt.setString(4, curso.getCurHoraInicio());
            stmt.setString(5, curso.getCurHoraFin());
            stmt.setString(6, curso.getCurObservacion());
            stmt.setString(7, curso.getCurLugarImpartido());
            stmt.setInt(8, curso.getCurDuracion());
            stmt.setInt(9, curso.getCurDuracionMinutos());
            stmt.setBoolean(10, curso.isCurProyector());
            stmt.setInt(11, curso.getCliId()); ///AQUI PUEDE FALLAR
            stmt.setString(12, curso.getCurCodINEM());
            //stmt.setInt(13, curso.getCurNuAccion()); //ESTOS SOBRAN
            //stmt.setInt(14, curso.getCurNuGrupo()); //SOBRA
            //stmt.setInt(15, curso.getCurRutaDoc()); //SOBRA
            stmt.setInt(13, curso.getTipCurId()); ///AQUI PUEDE FALLAR
            stmt.setBoolean(14, curso.isEnviarCorreo());
            stmt.setBoolean(15, curso.isCurAplazado());
            stmt.setInt(16, curso.getCurFaltasMes());
            stmt.setInt(17, curso.getCurTotalFaltas());
            stmt.setInt(18, curso.getCurPlazoReserva());
            stmt.executeUpdate();
            rs = stmt.getGeneratedKeys();
            if (rs.next()) {
                id = rs.getInt(1);
            }
            stmt.close();
        } catch (SQLException ex) {
            // System.out.println(ex);
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }

        return id;
    }

    /**
     * Metodo que elimina un curso de la base de datos, incluyendo los datos relacionados con ese curso en las tablas CLASE, MODULO, ALUMCURSO.
     * @author: Álvaro/Borja
     * @param Id del Curso.
     */
    public void eliminarCurso(int idCurso) throws GestorFormacionExcepcion {
        Connection con = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            //con.setAutoCommit(false);
            PreparedStatement stmt;
            //BORRAMOS CLASES
//            stmt = con.prepareStatement("DELETE FROM Clase WHERE CurId=" + idCurso);
//            stmt.executeUpdate();
//            //BORRAMOS bibliografia asociada a los modulos
//            stmt = con.prepareStatement("DELETE FROM Bibliografia WHERE ModId IN (SELECT ModId FROM modulo where CurId=" + idCurso + ")");
//            stmt.executeUpdate();
            //Borramos el calendario
            //stmt = con.prepareStatement("DELETE FROM Clase WHERE CurId=" + idCurso);
            //stmt.executeUpdate();
            //BORRAMOS MODULOS
//            stmt = con.prepareStatement("DELETE FROM Modulo WHERE CurId=" + idCurso);
//            stmt.executeUpdate();

            ArrayList<Integer> aidAlumno = new ArrayList<Integer>();
            //Seleccionamos los Alumnos de AlumCurso por el IdCurso
            stmt = con.prepareStatement("SELECT AluId FROM AlumCurso WHERE CurId="+idCurso);
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){
                aidAlumno.add(rs.getInt("AluId"));
            }
            rs.close();
             //Buscamos si cada alumno esta en más cursos
            for(int i=0;i<aidAlumno.size();i++){
                stmt = con.prepareStatement("SELECT Practicas, ValFinal, AluId, CurId, Terminado, FchUltiCla, Reserva, Orden, Avisos, Observaciones FROM alumcurso WHERE AluId=" + aidAlumno.get(i));
                rs = stmt.executeQuery();
                if (!rs.next()) {
                    //BORRAMOS El alumno si no está en más cursos.
                    stmt = con.prepareStatement("DELETE FROM Alumno WHERE AluId=" + aidAlumno.get(i));
                    stmt.executeUpdate();
                    //BORRAMOS SMSEnvios_Alumnos
                    stmt = con.prepareStatement("DELETE FROM SMSEnvios_Alumnos WHERE AluId=" + aidAlumno.get(i));
                    stmt.executeUpdate();
                }
            }
//            //BORRAMOS AlumCurso
//            for(int i=0;i<aidAlumno.size();i++){
//                stmt = con.prepareStatement("DELETE FROM AlumCurso WHERE CurId=" + idCurso+" AND AluId=" + aidAlumno.get(i));
//                stmt.executeUpdate();
//            }

            ArrayList<Integer> aCorId = new ArrayList<Integer>();
            //Seleccionamos los Adjuntos de Correo por el IdCurso
            stmt = con.prepareStatement("SELECT CorId FROM Correo WHERE CurId="+idCurso);
            rs = stmt.executeQuery();
            while(rs.next()){
                aCorId.add(rs.getInt("CorId"));
            }
            //BORRAMOS Adjuntos
            for(int j=0;j<aCorId.size();j++){
                stmt = con.prepareStatement("DELETE FROM Adjunto WHERE CorId="+ aCorId.get(j));
                try {
                stmt.executeUpdate();
                }
                catch (SQLException ex)
                {
                    ex.getMessage();
                }
            }
            //BORRAMOS CLASES
            stmt = con.prepareStatement("DELETE FROM Enccur WHERE CurId=" + idCurso);
            stmt.executeUpdate();
            //BORRAMOS Acciones
            stmt = con.prepareStatement("DELETE FROM Acciones WHERE CurId=" + idCurso);
            stmt.executeUpdate();
            //BORRAMOS CURSO
            stmt = con.prepareStatement("DELETE FROM Curso WHERE CurId=" + idCurso);
            stmt.executeUpdate();
            
//            con.commit();
            stmt.close();
            
        } catch(SQLException ex){
            try {
                con.rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex1);
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }

    /**
     * Metodo que obtiene todos los registros de la tabla Curso.
     * @author
     * @return Devuelve una lista que contiene todos los cursos.
     */
    public ArrayList getTodosCursos() throws GestorFormacionExcepcion {
        ArrayList<Curso> cursos = new ArrayList<Curso>();
        Curso curso;
        Connection conexion = null;
        String sql = "SELECT CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva FROM CURSO";

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                curso = instanciarCurso(rs);
                cursos.add(curso);
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return cursos;
    }

    public ArrayList getTodosCursosActivos() throws GestorFormacionExcepcion {
        ArrayList<Curso> cursos = new ArrayList<Curso>();
        Curso curso;
        Connection conexion = null;
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date hoy = new Date();
        String sql = "SELECT CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva FROM CURSO where CurFchaFinReal >= '" + sdf.format(hoy) + "'";
        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            PreparedStatement stmt = conexion.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                curso = instanciarCurso(rs);
                cursos.add(curso);
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
            return cursos;
        }
    }

    public ArrayList getMailsAlumnosCurso(int idCurso) throws GestorFormacionExcepcion {
        ArrayList<String> mails = new ArrayList<String>();
        String mail = "";
        Connection conexion = null;
        String sql = "SELECT AluMail FROM ALUMNO AS A INNER JOIN ALUMCURSO AS AC ON A.AluId = AC.AluId WHERE AC.CurId = " + idCurso;
        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            PreparedStatement stmt = conexion.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                mail = (rs.getString("AluMail"));
                mails.add(mail);
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
            return mails;
        }
    }

    /**
     * Crea una instancia de Curso con los datos obtenidos de la base de datos.
     * @author
     * @param rs: Recibe un ResultSet con una posición concreta.
     * @return Devuelve una instancia de curso con los datos del ResultSet indicado.
     */
    private Curso instanciarCurso(ResultSet rs) throws GestorFormacionExcepcion {
        Curso curso = new Curso();
        DAOFactory factoria = DAOFactory.getDAOFactory(DAOFactory.SQLSERVER);
        IClienteDAO cliDAO = factoria.getIClienteDAO();
        ITipoCursoDAO tipoDAO = factoria.getITipoCursoDAO();
        IResponsableDAO respDAO = factoria.getIResponsableDAO();

        try {
            curso.setCurId(rs.getInt("CurId"));
            curso.setCurNom(rs.getString("CurNom"));
            Timestamp t = rs.getTimestamp("CurFchaInReal");
            curso.setCurFchaInReal(rs.getTimestamp("CurFchaInReal")); //fecha al reves
            t = rs.getTimestamp("CurFchaFinReal");
            curso.setCurFchaFinReal(rs.getTimestamp("CurFchaFinReal")); //fecha al reves
            curso.setCurHoraInicio(rs.getString("CurHoraInicio"));
            curso.setCurHoraFin(rs.getString("CurHoraFin"));
            curso.setCurObservacion(rs.getString("CurObservacion"));
            curso.setCurLugarImpartido(rs.getString("CurLugarImpart"));
            curso.setCurDuracion(rs.getInt("CurDuracion"));
            curso.setCurDuracionMinutos(rs.getInt("CurDuracionMinutos"));
            curso.setCurProyector(rs.getBoolean("CurProyector"));
            curso.setCliId(rs.getInt("CliId"));
            curso.setCli(cliDAO.buscarCliente(rs.getInt("CliId")));
            t = rs.getTimestamp("CurFchaInPrev");
            curso.setCurFchaInPrev(rs.getTimestamp("CurFchaInPrev")); //fecha al reves
            t = rs.getTimestamp("CurFchaFinPrev");
            curso.setCurFchaFinPrev(rs.getTimestamp("CurFchaFinPrev")); //fecha al reves
            curso.setCurCodINEM(rs.getString("CurCodINEM"));
            curso.setCurNuAccion(rs.getString("CurNuAccion"));
            curso.setCurNuGrupo(rs.getString("CurNuGrupo"));
            curso.setCurRutaDoc(rs.getString("CurRutaDoc"));
            curso.setTipCurId(rs.getInt("TipCurId"));
            curso.setTipoCur(tipoDAO.buscarTipoCurso(rs.getInt("TipCurId")));
            curso.setEnviarCorreo(rs.getBoolean("EnviarCorreo"));
            curso.setCurAplazado(rs.getBoolean("CurAplazado"));
            curso.setCurFaltasMes(rs.getInt("CurFaltasMes"));
            curso.setCurTotalFaltas(rs.getInt("CurTotalFaltas"));
            curso.setCurPlazoReserva(rs.getInt("CurPlazoReserva"));
            // ¿Que pasa con el responsable de un curos? ¿Donde se muestra?
            //curso.setResp(respDAO.listarResponsables(rs.getInt("CurId"))); //comprobar nombre

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } 
        return curso;
    }

    /**
     * Método que lista todos los cursos.
     * @author: dbaykbp.bn
     * @param filtro: Filtro que hay que aplicar a la consulta.
     * @return Devuelve una lista con todos los cursos y sus datos.
     */
    public ArrayList<Curso> listarCursos(FiltroCurso filtro) throws GestorFormacionExcepcion {
        ArrayList<Curso> cursos = new ArrayList<Curso>();
        Curso curso;
        Connection conexion = null;
        int primerelemento = (filtro.getPagsiguiente() - 1) * filtro.getElementospag() + 1;
        int ultimoelemento = filtro.getPagsiguiente() * filtro.getElementospag();
 //       String sql = "SELECT CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva FROM (" + filtro.getSQL() + ") AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN " + primerelemento + " AND " + ultimoelemento;
          String sql = filtro.getSQL();
        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                if (rs.getRow()>= primerelemento && rs.getRow()<=ultimoelemento){
                curso = instanciarCurso(rs);
                cursos.add(curso);
                }
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
        return cursos;
    }

    /**
     * Método que lista todos los cursos que ha cursado o esta cursando un alumno.
     * @author: Sara y Alvaro
     * @param idAlumno: identificador de un alumno
     * @param idCurso: identificador de un curso
     * @return Devuelve una lista con todos los cursos y sus datos.
     */
    public ArrayList<Curso> listarCursosDeAlumno(int idAlumno) throws GestorFormacionExcepcion {
        ArrayList<Curso> cursos = new ArrayList<Curso>();
        Curso curso;
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT c.CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva, Practicas, ValFinal, AluId, c.CurId, Terminado, FchUltiCla, Reserva, Orden, Avisos, Observaciones FROM curso AS c INNER JOIN alumcurso AS a ON c.CurId = a.CurId WHERE a.AluId=?");
            stmt.setInt(1, idAlumno);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                curso = instanciarCurso(rs);
                cursos.add(curso);
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return cursos;
    }

    /**
     * Método que lista los lugares de los cuales se va a elegir uno.
     * @author: dbaykbp.bn
     * @return Devuelve la lista de los lugares disponibles.
     */
    public ArrayList<String> listarLugares() throws GestorFormacionExcepcion {
        ArrayList<String> lugares = new ArrayList<String>();
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT CurLugarImpart FROM curso GROUP BY CurLugarImpart");
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                if (rs.getString("CurLugarImpart") != null && !rs.getString("CurLugarImpart").trim().isEmpty()) {
                    lugares.add(rs.getString("CurLugarImpart"));
                }
            }
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
        
        return lugares;
    }

    /**
     * Metodo que modifica un curso en la base de datos.
     * @author: Álvaro/Borja
     * @param curso Contiene los datos del curso.
     * @return Devuelve la id del curso.
     */
    public int modificarCurso(Curso curso) throws GestorFormacionExcepcion {
        Connection con = null;
        SentenciaNula stmt = null;
        int registros = 0;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            stmt = new SentenciaNula(con, "UPDATE Curso SET CurNom=?, CurFchaInReal=?, CurFchaFinReal=?, CurHoraInicio=?, CurHoraFin=?, CurObservacion=?, CurLugarImpart=?, CurDuracion=?, CurDuracionMinutos=?, CurProyector=?, CliId=?,  CurCodINEM=?, CurNuAccion=?, CurNuGrupo=?, CurRutaDoc=?, TipCurId=?, EnviarCorreo=?, CurAplazado=?, CurFaltasMes=?, CurTotalFaltas=?, CurPlazoReserva=? WHERE curId=" + curso.getCurId());
            stmt.setString(1, curso.getCurNom());
            stmt.setTimestamp(2, curso.getCurFchaInReal());
            stmt.setTimestamp(3, curso.getCurFchaFinReal());
            stmt.setString(4, curso.getCurHoraInicio());
            stmt.setString(5, curso.getCurHoraFin());
            stmt.setString(6, curso.getCurObservacion());
            stmt.setString(7, curso.getCurLugarImpartido());
            stmt.setInt(8, curso.getCurDuracion());
            stmt.setInt(9, curso.getCurDuracionMinutos());
            stmt.setBoolean(10, curso.isCurProyector());
            stmt.setInt(11, curso.getCliId()); ///AQUI PUEDE FALLAR
            stmt.setString(12, curso.getCurCodINEM());
            stmt.setString(13, curso.getCurNuAccion());
            stmt.setString(14, curso.getCurNuGrupo());
            stmt.setString(15, curso.getCurRutaDoc());
            stmt.setInt(16, curso.getTipCurId()); ///AQUI PUEDE FALLAR
            stmt.setBoolean(17, curso.isEnviarCorreo());
            stmt.setBoolean(18, curso.isCurAplazado());
            stmt.setInt(19, curso.getCurFaltasMes());
            stmt.setInt(20, curso.getCurTotalFaltas());
            stmt.setInt(21, curso.getCurPlazoReserva());
            registros = stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            //System.out.println(ex);
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        
        return curso.getCurId();
    }

    /**
     * Método que visualiza un curso en concreto.
     * @author
     * @param idCurso: El curso que queremos visualizar.
     * @return Devuelve el curso seleccionado.
     */
    public Curso visualizarCurso(int idCurso) throws GestorFormacionExcepcion {
        Curso curso = null;
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva FROM Curso WHERE CurId = ?");
            stmt.setInt(1, idCurso);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                curso = instanciarCurso(rs);
            }
            rs.close();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
        
        return curso;
    }

    /**
     * Metodo que comprueba mediante un Id que el curso exista en la tabla Curso.
     * @author: Xarles y Borja
     * @param idCurso: identificador del curso que se quiere comprobar.
     * @return Devuelve true en caso de que el curso exista y false en caso contrario.
     */
    public boolean existecurso(int idCurso) throws GestorFormacionExcepcion {
        boolean existe = false;
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT CurId FROM Curso WHERE CurId = ?");
            stmt.setInt(1, idCurso);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                existe = true;
            }
            rs.close();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCursoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
        
        return existe;
    }
}
